import Snake from "./Snake";
import Food from "./Food";
import ScorePanel from "./ScorePanel"
import { createDispatchHook } from "react-redux";
// 游戏控制器，控制其他所有的类
class GameControl {
    // 定义三个属性
    // 蛇
    snake: Snake;
    // 食物
    food: Food;
    // 记分牌
    scorelPanel: ScorePanel;

    // 创建一个属性用存储蛇移动的方向 也就是按键的方向
    direction: string = "";

    // 创建一个属性判断是否结束 是否撞墙
    isLive: boolean = false;
    constructor() {
        this.snake = new Snake();
        this.food = new Food();
        this.scorelPanel = new ScorePanel();

        this.init();
    }
    // 游戏初始化, 调用后游戏开始
    init() {
        document.addEventListener('keydown', this.keydownHandler.bind(this));

        // 调用run方法，是蛇移动
        this.run();
    }
    // 创建一个键盘按下的响应函数
    keydownHandler (event: KeyboardEvent) {
        // ArrowUp ArrowDown ArrowLeft
        // 需要检查event.key的值是否合法，确保用户是否按了正确的按键
        this.direction = event.key;
        this.run();
    }
    // 创建一个控制蛇移动的方法
    run() {
        // 根据方向 来使蛇的位置发生变化
        // 向上 top 减少
        // 向下 top 增加
        // 向左 left 减少
        // 向右 right 增加
        let X = this.snake.X;
        let Y = this.snake.Y;
        // 根据按键的方向来修改对应位置
        switch(this.direction) {
            case "ArrowUp":
                // 向上移动
                Y -= 10;
                break;
            case "Up":
                Y-= 10;
                break;
            case "ArrowDown":
            case "Down":
                Y += 10;
                break;
            case "ArrowLeft":
                X -= 10;
                break;
            case "Left":
                X -= 10;
                break;
            case "ArrowRight":
                X += 10;
                break;
            case "Right":
                X += 10;
                break;
            default:
                break;

        }
        //  检查蛇是否吃到食物
        this.checkEat(X, Y);
        try{
            this.snake.X = X;
            this.snake.Y = Y;
        }catch({message}) {
            alert(message);
            // 将isLive设置为false
            this.isLive = false;
        }

        // 开启一个定时器调用
        this.isLive && setTimeout(this.run.bind(this), 300 - (this.scorelPanel.level - 1) * 30);
    }

    // 定义一个方法，用来检查蛇是否吃到食物
    checkEat(X: number, Y: number): boolean {
        // 当食物的坐标和蛇头的坐标是一致的，则表示吃到食物了
        if (this.food.X === X && this.food.Y === Y) {
                // 改变食物的位置
                this.food.change();
                // 分数增加
                this.scorelPanel.addScore();
                // 蛇要增加一节
                this.snake.addBody();
                return true;
        }
        return false;
    }
}
export default GameControl;